import express from 'express';
import config from 'config-lite';
import router from './routes/index.js';
// cookie-parser是Express的中间件，用来实现cookie的解析，是官方脚手架内置的中间件之一。
// 它的使用非常简单，但在使用过程中偶尔也会遇到问题。一般都是因为对Express + cookie-parser的签名、验证机制不了解导致的。
// 本文深入讲解Express + cookie-parser的签名和验证的实现机制，以及cookie签名是如何增强网站的安全性的。
import cookieParser from 'cookie-parser'
import session from 'express-session';
// 该模块用于将session存入mongo中
import connectMongo from 'connect-mongo';
// 日志对于问题定位、调试，系统性能调优至关重要，尤其是系统复杂以及在线运行的情况下。
// 好的开发框架都会有一个可开启关闭/可配置记录级别的日志系统。我们从以下几个方面来做选型：
// 1. 每行日志都需要有准确无误的时间戳
// 2. 日志格式容易被人理解同时也容易被计算机进行分析处理
// 3. 允许配置不同的日志输出，比如对于不同级别的日志配置不同的处理方式
// 基于上述的要求，有两款Node.js框架脱颖而出，分别是Bunyan和Winston。
// Bunyan by Trent Mick.
// Winston（Flatiron 框架的一部分），由nodejitstu赞助.
import winston from 'winston';
// 我们使用 winston 和 express-winston 记录日志。新建 logs 目录存放日志文件，修改 index.js，在：
import expressWinston from 'express-winston';
import history from 'connect-history-api-fallback';
import chalk from 'chalk';
// import Statistic from './middlewares/statistic'
// 每天加载第三方新的视频首页数据
import './initData'
//解析,用req.body获取post参数

const app = express();
// var cors = require("cors");
// app.use(cors());

// 单页应用程序（SPA）通常仅使用可由Web浏览器访问的一个索引文件：通常index.html。然后，通过HTML5历史记录API的帮助，通常会使用JavaScript来处理应用程序中的导航 。这导致用户点击刷新按钮或直接访问着陆页之外的页面时出现问题，例如/help或者/help/online 当Web服务器绕过索引文件以在该位置找到文件时。当您的应用程序是SPA时，Web服务器将无法尝试检索该文件，并向用户返回404 - 未找到的 消息。
// 这个微小的中间件解决了一些问题。具体来说，/index.html只要有满足以下条件的请求，它将会将请求的位置更改为您指定的索引（默认为）：
// app.use(history());

const body_parser = require("body-parser");
app.use(body_parser.json());
app.use(body_parser.urlencoded({extended: false}))

app.all('*', (req, res, next) => {
  const {origin, Origin, referer, Referer} = req.headers;
  const allowOrigin = origin || Origin || referer || Referer || '*';
  res.header("Access-Control-Allow-Origin", allowOrigin);
  // res.header("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With");
  res.header("Access-Control-Allow-Headers", "*");
  res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
  res.header("Access-Control-Allow-Credentials", true); //可以带cookies
  res.header("X-Powered-By", 'Express');


  req.method === 'OPTIONS' ? res.sendStatus(204) : next()
});

// app.use(Statistic.apiRecord)
const MongoStore = connectMongo(session);
app.use(cookieParser());
app.use(session({
  name: config.session.name,
  secret: config.session.secret,
  resave: true,
  saveUninitialized: false,
  cookie: config.session.cookie,
  store: new MongoStore({
    url: config.url
  })
}))

app.use(expressWinston.logger({
  transports: [
    new (winston.transports.Console)({
      json: true,
      colorize: true
    }),
    new winston.transports.File({
      filename: 'logs/success.log'
    })
  ]
}));

app.use(expressWinston.errorLogger({
  transports: [
    new winston.transports.Console({
      json: true,
      colorize: true
    }),
    new winston.transports.File({
      filename: 'logs/error.log'
    })
  ]
}));

app.use(express.static('./public'));

router(app);


app.listen(config.port, () => {
  console.log(
    chalk.green(`成功监听端口：http://0.0.0.0:${config.port}`)
  )
});



